package com.cskaoyan.javase.array._2memory;

/**
 * 练习3：
 * 定义两个数组：
 * 静态初始化一个数组，输出数组名，元素取值，长度
 * 然后声明第二个数组，把第一个数组的地址赋值给第二个数组。
 * 输出第二个数组的数组名，元素取值，长度
 * 然后给第二个数组赋值，再次输出两个数组的名及元素
 *
 * 一个经典的初学者问题
 * 既然引用数据类型具有默认初始化，对象中的元素具有默认值，那为什么声明一个数组后为什么不能立刻使用呢？
 * 栈上的内容没有默认初始化,没有默认值
 * 堆上对象中的元素是有默认初始化的,具有默认值
 *
 * 引用数据类型具有默认初始化,指的是堆上对象中的元素具有默认初始化
 * 声明一个数组,引用存储在方法栈帧中,是没有默认值的
 *
 *
 * @since 15:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo4 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        int[] arr2;
        // 赋值,是将arr中存储的地址赋值给arr2引用
        /*
            这时arr和arr2两个引用指向了同一个对象
            相当于一个对象有了两个名字
            那么
            使用任何一个引用来操作对象
            对于对象的改变都会体现到另一个引用中
         */
        arr2 = arr;
        System.out.println(arr);
        System.out.println(arr2);

        System.out.println(arr[0]);
        System.out.println(arr2[0]);

        arr[0] = 666;
        System.out.println(arr2[0]);

        int[] arr3 = new int[3];
        // new关键字的作用: 一定会在堆上创建一个新的,独立的对象
        System.out.println(arr3);

        /*
            比较运算符在引用数据类型变量之间的使用
            首先要明确引用数据类型变量用比较运算符连接:
                1.只能使用"=="或者"!=",没有大小概念
                2.比较的是引用中存放的地址
            两个引用数据类型变量用"=="连接引用,返回true
            说明 引用中存储的地址是一样的
            说明 引用指向同一个对象

            扩展:
                比较运算符连接引用数据类型
                要注意左右两边的引用数据类型应该是一致的(兼容的)
                如果是数组引用的话,必须是完全一致的数组类型,才能够比较.
         */
        System.out.println(arr == arr2);
        System.out.println(arr == arr3);

        double[] arr4 = new double[3];
        // System.out.println(arr3 == arr4);

    }
}
